package com.zhoux.api.io.raf;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

/**
 * @author taoyi
 * @version 1.0
 * @date 2021/3/25 9:20
 *
 * 通过提高每次读写的数据量, 减少实际读写的次数可以提高读写效率
 *
 */
public class Copy_Demo2 {
    public static void main(String[] args) {
        RandomAccessFile src = null;
        RandomAccessFile desc = null;

        try {
            src = new RandomAccessFile(".\\src\\main\\java\\com\\zhoux\\file\\11.gif","r");
            desc = new RandomAccessFile(".\\src\\main\\java\\com\\zhoux\\file\\33.gif","rw");
            /*
            RandomAccessFile提供了块读写的方法
            读:
            int read(byte[] data)
            一次性从文件中读取给定的字节数组总长度的字节量并装入到该数组中,返回值表示实际读取
            到的字节量.如果返回值为-1则表示EOF.

            例如
            文件数据(总共6个字节):
            11011101 10101101 00110011 11010010 11001101 00111101

            块读:
            byte数组:  byte[] data = new byte[10];  创建能保存10个字节的数组
            int len=0; 表示每次实际读取到的字节量

            读取前
            data:[00000000,00000000,00000000,00000000]
            len:0

            len = src.read(data);//一次性从文件中读取4个字节并存入该数组
            读取后:
            data:[11011101,10101101,00110011,11010010]
            len:4



            块写操作
            void write(byte[] data)
            一次性将给定的字节数组中的所有字节写入文件

            void write(byte[] data,int offset,int len)
            一次性将给定的字节数组中从下标offset处开始的连续len个字节写入文件

            例如:
            data:[11011101,10101101,00110011,11010010]

            desc.write(data);
            复制的文件内容:
            11011101 10101101 00110011 11010010
         */

            byte[] data = new byte[10*1024];
            int len = 0;

            long start = System.currentTimeMillis(); // 获取当前系统时间的毫秒值
            // 从原文件中一次性读取10KB 数据到data中
            while ((len = src.read(data))!=-1){
                // 将读取的10KB 数据一次性写入到复制文件中
                desc.write(data);
            }
            long end = System.currentTimeMillis();
            System.out.println("复制完成！耗时: "+(end-start)+"ms");
        } catch (FileNotFoundException e) {
            System.out.println("操作失败！");
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                desc.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                src.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
